package edu.tfh.s2.ehkbot.daten;

import java.util.Date;

/**
 * Zeitgeber Liefert die für das System gültige Zeit. Zeitgeber benutzt das State Pattern und das Singelton
 * Pattern.
 * 
 * @author s2zehn
 */
public class Zeitgeber {
	/**
	 * Das State für Zeitgeber.
	 */
	public interface ZeitgeberState extends Cloneable {
		/**
		 * Clont das State.
		 * 
		 * @return Das Geclonte state.
		 */
		public Object clone();

		/**
		 * Liefert das Aktuelle Datum.
		 * 
		 * @return Das Jetzige Datum.
		 */
		public Date getCurrentDate();

		/**
		 * Stopt den Thread für in ms Angegebene Millisekunden.
		 * 
		 * @param ms
		 *            Zeit in Millisekunden die gestopt werden soll.
		 */
		public void sleep(long ms);
	}

	private static Zeitgeber instance;

	/**
	 * Singelton Pattern Methode.
	 * 
	 * @return Die Einzige Instanz von Zeitgeber.
	 */
	public static Zeitgeber getInstance() {
		if (instance == null) {
			instance = new Zeitgeber(InitFactory.getInstance().getZeitgeber());
		}
		return instance;
	}

	private ZeitgeberState state;

	/**
	 * Konstruktor der das State entgegen nimmt.
	 * 
	 * @param zeitgeberState
	 *            Das State welches das Verhalten vorgibt.
	 */
	private Zeitgeber(ZeitgeberState zeitgeberState) {
		this.state = zeitgeberState;
	}

	/**
	 * Liefert das Aktuelle Datum.
	 * 
	 * @see {@link ZeitgeberState#getCurrentDate()}
	 * @return Das Jetzige Datum.
	 */
	public Date getCurrentDate() {
		return state.getCurrentDate();
	}

	/**
	 * Stopt den Thread für in ms Angegebene Millisekunden.
	 * 
	 * @see {@link ZeitgeberState#sleep()}
	 * @param ms
	 *            Zeit in Millisekunden die gestopt werden soll.
	 */
	public void sleep(long ms) {
		state.sleep(ms);
	}
}
